package com.company;

import java.util.*;

public class jihe {
    public static void main(String[] args) {

//        myHashSet();
//        myLinkedHashSet();
//         myTreeSet();
//
//        myLinkList();
//        myArrayList();
//
//        myHashMap();
//        myLinkedHashMap();
//        myTreeMap();
    }

    /**
     * Set接口的HashSet实现
     * 底层由Hash表支持，（实际就是一个HashMap实例）
     * 可以为null，不能重复，元素无序,不排序
     */
    public static void myHashSet(){
        //HashSet
        Set<String> set = new HashSet();

        set.add("123");
        set.add("123");
        set.add("张三");
        set.add("李四");
        set.add("");
        set.add("王五");
        set.add(null);

        for (String s:set) {
            System.out.println(s);
        }
        System.out.println("======================================");
        Iterator iter = set.iterator();
        for (; iter.hasNext();){

            System.out.println(iter.next());
        }
        System.out.println("======================================");
        System.out.println(set.size());
    }

    /**
     * Set接口的LinkedHashSet实现
     * 底层由双向链表实现
     * 可以为null，不可重复，元素有序，不排序
     */
    public static void myLinkedHashSet(){
        //LinkedHashSet
        Set<String> set = new LinkedHashSet<>();

        set.add("123");
        set.add("123");
        set.add("张三");
        set.add("李四");
        set.add("");
        set.add("王五");
        set.add(null);

        for (String s:set) {
            System.out.println(s);
        }
        System.out.println("======================================");
        Iterator iter = set.iterator();
        for (; iter.hasNext();){

            System.out.println(iter.next());
        }
        System.out.println("======================================");
        System.out.println(set.size());
    }

    /**
     * Set接口的TreeSet实现
     * 底层由红黑树实现
     * 不可以为null，不可重复，元素无序，排序
     */
    public static void myTreeSet(){
        //TreeSet
        Set<String> set = new TreeSet<>();

        set.add("123");
        set.add("123");
        set.add("张三");
        set.add("李四");
        set.add("");
        set.add("王五");

        set.forEach(System.out::println);
        System.out.println("======================================");
        Iterator iter = set.iterator();
        for (; iter.hasNext();){

            System.out.println(iter.next());
        }
        System.out.println("======================================");
        System.out.println(set.size());
    }


    /**
     * list接口linkList实现
     * 底层为链表，查询速度慢，存取速度快
     * 可以重复，元素有序，可以下标索引
     */
    public static void myLinkList(){
        List<String> list = new LinkedList<>();

        list.add("123");
        list.add("123");
        list.add("张三");
        list.add("李四");
        list.add("");
        list.add("王五");
        list.add(null);
        list.add(null);


        for (Object s:list) {
            System.out.println(s);
        }
    }

    /**
     * list接口linkList实现
     * 底层为数组，查询速度快，存取速度慢
     * 可以重复，元素有序，可以下标索引
     */
    public static void myArrayList(){
        List<String > list = new ArrayList<>();


        list.add("123");
        list.add("123");
        list.add("张三");
        list.add("李四");
        list.add("");
        list.add("王五");
        list.add(null);
        list.add(null);


        for (Object s:list) {
            System.out.println(s);
        }
    }


    /**
     * map接口的HashMap实现
     * 根据Hash表存储键值对
     * 可以重复（键值重复值进行覆盖），元素无序，排序（通过键进行排序）
     * 键可以为空，值可以为空
     */
    public static void myHashMap(){
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"张三");
        map.put(3,"李四");
        map.put(5,"王五");
        map.put(2,"小红");
        map.put(4,"小明");
        map.put(6,null);
        map.put(null,null);

        Iterator iter = map.keySet().iterator();
        while (iter.hasNext()){
            System.out.println(map.get(iter.next()));
        }

        System.out.println("================================");

        for (Integer i: map.keySet()) {
            System.out.println(i + "=" +map.get(i));
        }
    }


    /**
     * map接口的LinkedHashMap实现
     * 根据Hash表存储键值对
     * 可以重复（键值重复值进行覆盖），元素游戏，不排序
     * 键可以为空，值可以为空
     */
    public static void myLinkedHashMap(){
        Map<Integer,String> map = new LinkedHashMap<>();
        map.put(1,"张三");
        map.put(3,"李四");
        map.put(5,"王五");
        map.put(2,"小红");
        map.put(4,"小明");
        map.put(6,null);
        map.put(null,null);

        Iterator iter = map.keySet().iterator();
        while (iter.hasNext()){
            System.out.println(map.get(iter.next()));
        }

        System.out.println("================================");

        for (Integer i: map.keySet()) {
            System.out.println(i + "=" +map.get(i));
        }
    }


    /**
     * map接口的TreeMap实现
     * 根据Hash表存储键值对
     * 可以重复（键值重复值进行覆盖），元素无序，排序（通过键进行排序）
     * 键不可以为空，值可以为空
     */
    public static void myTreeMap(){
        Map<Integer,String> map = new TreeMap<>();
        map.put(1,"张三");
        map.put(3,"李四");
        map.put(5,"王五");
        map.put(2,"小红");
        map.put(4,"小明");
        map.put(6,null);


        Iterator iter = map.entrySet().iterator();
        while (iter.hasNext()){
            System.out.println(iter.next());
        }

        System.out.println("================================");

        for (Integer i: map.keySet()) {
            System.out.println(i + "=" +map.get(i));
        }
    }
}
